package com.ty.springbootshiro.controller;

import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ty.springbootshiro.entity.Role;
import com.ty.springbootshiro.entity.User;
import com.ty.springbootshiro.service.RoleService;
import com.ty.springbootshiro.service.UserService;
import jakarta.annotation.Resource;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * UserController
 *
 * @aurhor Administrator  whs
 * @since 2024/10/8
 */
@Controller
@RequestMapping("/user")
public class UserController {

    @Resource
    private RoleService roleService;
    @Resource
    private UserService userService;

    /**
     * 用户列表
     */
    @RequiresPermissions("L0601")
    @RequestMapping("/list")
    public String list(Model model, String usrName, Long roleId, Long pageIndex) {
        // 当前要查询的页码，如果是null则设置为默认查第1页
        pageIndex = pageIndex == null ? 1 : pageIndex;

        // 查询所有角色
        List<Role> roles = roleService.list();

//        System.out.println("roles:------> " + roles);

        // 分页查询用户列表
        Page page = new Page(pageIndex, 5L);
        Page<User> userPager = userService.userPage(roleId,usrName, page);

        // 设置数据到作用域
        model.addAttribute("usrName", usrName); // 数据回显
        model.addAttribute("roleId", roleId); // 数据回显
        model.addAttribute("roles", roles);
        model.addAttribute("userPager", userPager);

        // 跳转页面
        return "user/list";
    }

    /**
     * 去登录页
     */
    @RequiresPermissions("L060101")
    @GetMapping("/add")
    public String toAdd(Model model) {
        // 获取页面下拉列表需要的数据
        List<Role> roles = roleService.list();

        // 将数据设置到作用域
        model.addAttribute("roles", roles);

        // 跳转页面
        return "user/add";
    }

    /**
     * 检查用户名是否可用（{"result":"true"} 表示已存在，不可用）
     */
    @ResponseBody // REST风格，直接将数据写入响应流（对应Ajax请求）
    @GetMapping("/check")
    public String checkUsrName(String usrName, Long usrId) {
        JSONObject json = new JSONObject();
        if (usrName == null) {
            json.put("result", "error");
            return json.toJSONString();
        }
        User user = userService.getByUsrNameExceptUsrId(usrName, usrId);
        json.put("result", String.valueOf(user != null));
        return json.toJSONString();
    }

    /**
     * 跳转到修改页
     */

    @GetMapping("/edit")
    @RequiresPermissions("L060104")
    public String toEdit(Model model, Long usrId) {
        // 获取页面下拉列表需要的数据
        List<Role> roles = roleService.list();

        // 根据ID获取用户信息
        User user = userService.getUser(usrId);

        // 将数据设置到作用域
        model.addAttribute("roles", roles);
        model.addAttribute("user", user);

        // 跳转页面
        return "user/edit";
    }

    /**
     * 保存用户信息（新增和修改）
     */
    @RequiresPermissions("L060102")
    @PostMapping("/save")
    public String save(User user) {
        // 保存用户信息（如果user对象中有主键ID则修改，没有就新增）
        if (user.getUsrId() == null) {
            userService.add(user);
        }
        userService.upd(user);
        // 重定向到列表页面
        return "redirect:/user/list";
    }

    /**
     * 删除用户
     */
    @RequiresPermissions("L060103")
    @ResponseBody
    @PostMapping("/del/{usrId}")
    public Map<String, Object> del(@PathVariable("usrId") Long usrId) {
        Map<String, Object> map = new HashMap<>();
        boolean result = userService.deleteUser(usrId);
        map.put("result", String.valueOf(result));
        return map;
    }

}
